package com.wyz.note.project.generate.mybatisplus.config;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @Description:
 * @Author: wei yz
 * @Date: 2022/1/18 10:20
 */
public class CodeGenerator {

    private static String URL = "jdbc:mysql://127.0.0.1:3306/generator_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
    private static String USERNAME = "root";
    private static String PASSWORD = "root";

    private static String tables;

    static {
        tables = "sec_user,sec_permission,sec_role";
    }


    /**
     * 数据源配置
     */
    private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig
            .Builder(URL, USERNAME, PASSWORD);

    protected static List<String> getTables(String tables) {
        return tables == null ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

    /**
     * 执行 run
     */
    public static void main(String[] args) throws SQLException {

        FastAutoGenerator.create(DATA_SOURCE_CONFIG)
                // 全局配置
                .globalConfig(builder -> builder
                        .author("Wei yz")// 作者名	baomidou 默认值:作者
                        .fileOverride()// 覆盖已生成文件	默认值:false
                        .outputDir("D://weiyaozhong//my//generator//")// 指定输出目录	/opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
                        //.enableSwagger()// 开启 swagger 模式	默认值:false
                        //.enableKotlin()// 开启 kotlin 模式	默认值:false
                        .dateType(DateType.TIME_PACK)// 时间策略	DateType.ONLY_DATE 默认值: DateType.TIME_PACK
                        .commentDate("yyyy-MM-dd")// 注释日期	默认值: yyyy-MM-dd
                )
                // 包配置
                .packageConfig((builder) -> builder
                                .parent("com.wyz")// 父包名	默认值:com.baomidou
                                //.moduleName("")// 父包模块名	默认值:无
                                .entity("pojo")// Entity 包名	默认值:entity
                                .service("service")// Service 包名	默认值:service
                                .serviceImpl("service.impl")// Service Impl 包名	默认值:service.impl
                                .mapper("mapper")// Mapper 包名	默认值:mapper
                                .xml("mapper.xml")// Mapper XML 包名	默认值:mapper.xml
                                .controller("controller")// Controller 包名	默认值:controller
                        //.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://weiyaozhong//my//generator//"))// 路径配置信息
                )
                // 策略配置
                .strategyConfig(builder -> builder.addInclude(getTables(tables))
                        .enableCapitalMode()// 开启大写命名	默认值:false
                        .enableSkipView()// 开启跳过视图	默认值:false
                        .disableSqlFilter()// 禁用 sql 过滤	默认值:true，语法不能支持使用 sql 过滤表的话，可以考虑关闭此开关
                        .addTablePrefix("sec_", "c_")// 增加过滤表前缀

                        // Entity 策略配置
                        .entityBuilder()
                        // .superClass(BaseEntity.class)// 设置父类	BaseEntity.class
                        //.disableSerialVersionUID()//禁用生成 serialVersionUID	默认值:true
                        .enableChainModel()// 开启链式模型	默认值:false
                        //.enableLombok()// 开启 lombok 模型	默认值:false
                        .enableRemoveIsPrefix()// 开启 Boolean 类型字段移除 is 前缀	默认值:false
                        //.enableTableFieldAnnotation()// 开启生成实体时生成字段注解	默认值:false   Swagger API注解
                        //.enableActiveRecord()// 开启 ActiveRecord 模型	默认值:false
                        //.versionColumnName("version")// 乐观锁字段名(数据库)
                        //.versionPropertyName("version")// 乐观锁属性名(实体)
                        .logicDeleteColumnName("deleted")// 逻辑删除字段名(数据库)
                        //.logicDeletePropertyName("deleted")// 逻辑删除属性名(实体)
                        .naming(NamingStrategy.underline_to_camel)//数据库表映射到实体的命名策略	默认下划线转驼峰命名:NamingStrategy.underline_to_camel
                        .columnNaming(NamingStrategy.underline_to_camel)// 数据库表字段映射到实体的命名策略	默认为 null，未指定按照 naming 执行
                        //.addSuperEntityColumns("id", "created_by", "created_time", "updated_by", "updated_time")// 添加父类公共字段
                        //.addIgnoreColumns("age")// 添加忽略字段
                        .addTableFills(new Column("create_time", FieldFill.INSERT))// 添加表字段填充
                        .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
                        .idType(IdType.AUTO)// 全局主键类型
                        //.formatFileName("%sEntity")// 格式化文件名称

                        // Controller 策略配置
                        .controllerBuilder()
                        //.superClass(BaseController.class)// 设置父类
                        .enableHyphenStyle()// 开启驼峰转连字符	默认值:false
                        .enableRestStyle()// 开启生成@RestController 控制器	默认值:false
                        .formatFileName("%sController")// 格式化文件名称

                        // Service 策略配置
                        .serviceBuilder()
                        //.superServiceClass(BaseService.class)// 设置 service 接口父类	BaseService.class
                        //.superServiceImplClass(BaseServiceImpl.class)// 设置 service 实现类父类	BaseServiceImpl.class
                        .formatServiceFileName("%sService")// 格式化 service 接口文件名称
                        .formatServiceImplFileName("%sServiceImpl")// 格式化 service 实现类文件名称

                        // Mapper 策略配置
                        .mapperBuilder()
                        //.superClass(BaseMapper.class)// 设置父类	BaseMapper.class
                        .enableMapperAnnotation()// 开启 @Mapper 注解	默认值:false
                        .enableBaseResultMap()// 启用 BaseResultMap 生成	默认值:false
                        .enableBaseColumnList()// 启用 BaseColumnList	默认值:false
                        //.cache(MyMapperCache.class)// 设置缓存实现类	MyMapperCache.class
                        .formatMapperFileName("%sMapper")// 格式化 mapper 文件名称
                        //.formatXmlFileName("%sXml")// 格式化 xml 实现类文件名称


                        .build())
                .execute();
    }

}
